package main

import (
	"log"
)

/*
golang 的  interface , 它的底层实现由两部分组成，一个是类型，一个值，
也就是类似于：(Type, Value)。只有当类型和值都是nil的时候，才等于nil。看看下面的代码：
*/
type doError interface {
}

// 该方式是一个错误的例子
func do() interface{} { // error(*doError, nil)
	var err *doError
	return err // nil of type *doError
}

// 1) 正确做法
func do1() error {
	return nil
}

// ----- 另外一个例子 --------
func do2() *doError { // nil of type *doError
	return nil
}

func wrapDo() interface{} { // error (*doError, nil)
	return do2() // nil of type *doError
}
func main() {
	err := do()
	log.Printf("%+v", err)
	log.Printf("%+v", err == nil)

	log.Println("----- 另外一个例子 --------")
	err2 := wrapDo()         // error  (*doError, nil)
	log.Println(err2 == nil) // false

	//这里最终的输出结果也是false。为什么呢？尽管wrapDo函数返回的是error类型，
	// 但是do返回的却是*doError类型，也就是变成了（*doError，nil），自然也就和nil不相等了。
	// 因此，不要返回具体的错误类型。遵从这两条建议，才可以放心地使用if x != nil。
}
